package Algorithm;

public class test12 {
    // 给你一个整数数组 nums和一个整数 x, 每一次操作时，你应当移除数组 nums最左边或最右边的元素，然后从 x中减去该元素的值

    // 算法原理: 滑动窗口, 同向双指针
    // 思路: 把问题转换成从 nums中移除一个最长的子数组，使得剩余元素的和为 x
    // 换句话说，要从 nums中找最长的子数组，其元素和等于 sum−x，这里 sum为 nums所有元素之和
    public static void main(String[] args) {
        int[] nums = {3, 2, 20, 1, 1, 3};
        int n = nums.length, left = 0, right = 0, x = 10;
        int sum = 0, len = -1;
        // 求nums所有元素之和
        for (int a : nums) {
            sum += a;
        }
        int target = sum - x, tmp = 0;
        // 小优化
        if (target < 0) {
            return;
        }
        // 进窗口
        while (right < n) {
            tmp += nums[right];
            // 判断
            while (tmp > target) {
                // 出窗口
                tmp -= nums[left++];
            }
            // 判断 + 更新结果
            if (tmp == target) {
                len = Math.max(right - left + 1, len);
            }
            right++;
        }
        System.out.println(len == -1 ? -1 : n - len);
    }
}
